/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    debug_manager.c
 * @brief   调试信息输出管理者函数
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-28   | v0.0.1    | Kcode   | 配置信息头文件
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#ifndef _DEBUG_MANAGER_H
#define _DEBUG_MANAGER_H

/* 信息的调试级别,数值起小级别越高 */
#define	APP_EMERG			"<0>"	/* system is unusable */
#define	APP_ALERT			"<1>"	/* action must be taken immediately	*/
#define	APP_CRIT			"<2>"	/* critical conditions */
#define	APP_ERR	    		"<3>"	/* error conditions	*/
#define	APP_WARNING			"<4>"	/* warning conditions */
#define	APP_NOTICE			"<5>"	/* normal but significant condition	*/
#define	APP_INFO			"<6>"	/* informational */
#define	APP_DEBUG			"<7>"	/* debug-level messages */

#define DEFAULT_DBGLEVEL	4       /**< 信息的默认调试级别 */

/*!
 * 调试信息操作结构体
 */
typedef struct DebugOpr {
	char *name;                         /**< 名字 */
	int isUsed;                         /**< 是否允许被使用1：允许，0：不允许 */
	int (*DebugInit)(void);             /**< 调试模块的初始化函数 */
	int (*DebugExit)(void);             /**< 退出函数 */
	int (*DebugPrint)(char *strdata);   /**< 输出函数 */
	struct DebugOpr *ptNext;
}T_DebugOpr, *PT_DebugOpr;

/*!
 * @brief  注册"调试通道", 把PT_DebugOpr结构体放入链表
 * @param  ptDebugOpr[in] 一个结构体,表示调试通道
 * @return 0：注册成功，其他值：失败
 */
int RegisterDebugOpr(PT_DebugOpr ptDebugOpr);

/*!
 * @brief  显示本程序能支持的"调试模块"
 * @param  [in] 无
 * @return 无
 */
void ShowDebugOpr(void);

/*!
 * @brief  设置打印级别g_iDbgLevelLimit: 级别范围0~7, 数字越小级别越高
 *         高于或等于g_iDbgLevelLimit的调试信息才会打印出来
 * @param  precvbuf[in] 类似"dbglevel=3"
 * @return 0：成功
 */
int SetDebugLevel(char *precvbuf);

/*!
 * @brief  打印信息的总入口函数
 *         程序里用DBG_PRINTF来打印, 它就是DebugPrint
 *         在config.h里有这样的宏定义: #define DBG_PRINTF DebugPrint
 * @param  可变参数[in] 用法和printf完全一样
 * @return 0：成功
 */
int DebugPrint(const char * pFormat, ...);


/*!
 * @brief  根据名字取出指定的"调试模块"
 * @param  pName[in] 名字
 * @return NULL：失败,没有指定的模块, 非NULL：显示模块的PT_DebugOpr结构体指针
 */
PT_DebugOpr GetDebugOpr(char *pName);

/*!
 * @brief  开/关某个调试通道
 * @param  strBuf[in] 类似于以下字符串
 *                     stdout=0			   : 关闭stdout打印
 *                     stdout=1			   : 打开stdout打印
 *                     netprint=0		   : 关闭netprint打印
 *                     netprint=1		   : 打开netprint打印
 * @return 0：成功，-1：失败
 */
int SetDebugChanel(char *precvbuf);

/*!
 * @brief  注册调试通道,就是把PT_DebugOpr注册到链表中
 * @param  [in] 无
 * @return 0：成功，其他值：失败
 */
int DebugInit(void);

/*!
 * @brief  有些打印通道需要进行一些初始化, 比如网络打印需要绑定端口等等
 *         本函数用于执行这些初始化
 * @param  [in] 无
 * @return 0：成功，其他值：失败
 */
int InitDebugChanel(void);

/*!
 * @brief  注册"标准输出调试通道", 把g_tStdoutDbgOpr结构体放入链表中
 * @param  [in] 无
 * @return 0：成功, 其他值：失败
 */
int StdoutInit(void);

/*!
 * @brief  注册"网络输出调试通道", 把把g_tNetDbgOpr结构体放入链表中结构体放入链表中
 * @param  [in] 无
 * @return 0：成功, 其他值：失败
 */
int NetPrintInit(void);

#endif /* _DEBUG_MANAGER_H */
